package model;

import java.sql.SQLException;
import java.util.ArrayList;

/**
 * Repräsentiert die Verbindung zur Datenbank
 * 
 * @author Jonas Gutermuth
 */
@SuppressWarnings("serial")
public class GruppenRepository extends ArrayList<Gruppe> {

	private static GruppenRepository gruppenRepository = null;
	private static DatenbankSchnittstelle datenbankSchnittstelle;

	/**
	 * Repräsentiert die Verbindung zur Datenbank
	 * 
	 * @throws ClassNotFoundException
	 *             Klasse nicht gefunden.
	 * @throws SQLException
	 *             SQL exception
	 */
	private GruppenRepository() throws ClassNotFoundException, SQLException {

		datenbankSchnittstelle = DatenbankSchnittstelle.getInstance();
		addArray(datenbankSchnittstelle.getGruppen());

		System.out.println("Gruppen Repository geladen");
	}

	/**
	 * Fügt dem GruppenRepository ein Array von Gruppen hinzu.
	 * 
	 * @param gruppen
	 *            die hinzuzufpgenden Gruppen
	 */
	private void addArray(Gruppe[] gruppen) {
		for (int i = 0; i < gruppen.length; i++) {
			this.add(gruppen[i]);
		}
	}

	/**
	 * Speichert die Gruppe in Datenbank und Repository.
	 * 
	 * @param gruppe
	 *            die Gruppe
	 * @throws SQLException
	 * @throws IllegalArgumentException
	 * @throws ClassNotFoundException
	 */
	public void saveGruppe(Gruppe gruppe) throws IllegalArgumentException,
			SQLException, ClassNotFoundException {
		// arrays
		String[][] db_werte = new String[2][1];
		Benutzer[] mitglieder = gruppe.getBenutzer();
		// spaltenname
		db_werte[0][0] = "benutzerIds";
		// wert
		db_werte[1][0] = "";
		if (mitglieder != null) {
			for (int i = 0; i < mitglieder.length; i++) {
				db_werte[1][0] += mitglieder[i].getId() + ";";
			}
			if (db_werte[1][0].endsWith(";")) {
				db_werte[1][0] = db_werte[1][0].substring(0,
						db_werte[1][0].length() - 1);
			}
		}
		// Gruppe in Datenbank updaten
		datenbankSchnittstelle.update("gruppe", "id=" + gruppe.getId(),
				db_werte);

	}

	/**
	 * Gibt die Gruppen eines Benutzers zurück.
	 * 
	 * @param benutzerId
	 *            die ID des betreffenden Benutzers
	 * @return die Gruppen des Benutzers
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	//TODO Frage: Ist auch sichergestellt, dass immer mind. eine Gruppe zurückgegeben wird?
	public Gruppe[] getGruppe(int benutzerId) throws ClassNotFoundException,
			SQLException {
		ArrayList<Integer> temp = new ArrayList<Integer>();
		for (int i = 0; i < this.size(); i++) {
			if (this.get(i).inGruppe(benutzerId)) {
				temp.add(this.get(i).getId());
			}
		}
		Gruppe[] tempob = new Gruppe[this.size()];
		for (int i = 0; i < temp.size(); i++) {
			tempob[i] = getGruppeNachId(temp.get(i));
		}
		return tempob;
	}

	/**
	 * Gibt eine Gruppe mit der gegebenen ID zurück.
	 * 
	 * @param id
	 *            die ID der gefragten Gruppe
	 * @return die gefragte Gruppe
	 */
	public Gruppe getGruppeNachId(int id) {
		for (int i = 0; i < this.size(); i++) {
			if (this.get(i).getId() == id) {
				return this.get(i);
			}
		}
		return null;
	}

	/**
	 * Liefert eine Instanz des Repositorys zurück, damit dies nur einmal
	 * initiert wird.
	 * 
	 * @return GruppenRepository
	 * @throws ClassNotFoundException
	 *             Klasse nicht gefunden
	 * @throws SQLException
	 *             SQL-Exception
	 */
	public static GruppenRepository getInstance()
			throws ClassNotFoundException, SQLException {
		if (gruppenRepository == null) {
			gruppenRepository = new GruppenRepository();
		}
		return gruppenRepository;
	}
}
